package com.foo.designpattern.factory.abstractfactory;

/**
 * com.foo.designpattern.factory.abstractfactory
 * Created with IntelliJ IDEA.
 * Created by jiang on 2016-05-10 17:26.
 *
 * @Description 创建工厂的接口：抽象工厂类的核心
 * 抽象工厂模式的缺点：
 * 不太容易扩展新的产品：如果需要给整个产品族添加一个新的产品，那么就需要修改抽象工厂类，
 * 这样将会导致修改所有的工厂实现类。
 * 举例：如果在BMW的生产中添加新的产品轮胎，那么需要修改抽象工厂(AbstractFactory)类，
 * 这样，所有的工厂实现类也必须修改。
 * <p/>
 * 概念介绍：产品族和产品等级
 * 产品族：是指位于不同产品等级结构中，功能相关联的产品组成的家族。
 * 比如BMW320的发动机和BMW320的空调组成一个产品族，
 * BMW523的发动机和BMW523的空调组成一个产品族。
 * 产品等级：一个等级结构是由相同结构的产品组成。
 * 比如BMW320的发动机和BMW523的发动机同属一个产品等级，
 * BMW320的空调和BMW523的空调同属与一个产品等级。
 * <p/>
 * 产品族与产品等级示意图(■:占位符，不加的话格式化时图就不是想要的效果了)：
 * ■   产  ↑
 * ■   品  │
 * ■   族  │  发动机      空调     轮胎(类中没有，加入方便理解的)
 * ■       │
 * BMW320   │    ♞        ☃       ✪     这一行是同一个产品族
 * ■       │
 * BMW523   │    ♞        ☃       ✪     这一行是同一个产品族
 * ■        ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ →
 * ■            同一       同一      同一
 * ■          产品等级   产品等级   产品等级
 * <p/>
 * 显然，每一个产品族中含有产品的数目，与产品等级结构的数目是相等的。
 * 产品的等级结构与产品族将产品按照不同方法划分，形成一个二维的坐标系。
 * 横轴表示产品的等级结构，纵轴表示产品族，上图共有两个产品族，
 * 分布于三个不同的产品等级结构中。只要指明一个产品所处的产品族以及它所属的等级结构，
 * 就可以唯一确定这个产品。
 * 比如产品族是BMW320的产品等级结构为发动机的，就可以确定是BMW320的发动机。
 */

public interface AbstractFactory {
    // 制造发动机
     Engine createEngine();

    // 制造空调
     AirCondition createAirCondition();
}
